iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
自我挑戰組

Spring Boot 三十天挑戰賽系列 第 2

Day 02 - Spring Framework Core Technologies - Spring 框架中的硬核(?)技術

  • 分享至 

  • xImage
  •  

在打文章時腦中不知為何一直響起 smooth operatorrrrrr~
所以今天 BGM 就來首 Smooth Operator by Sade 吧 XD
Yes

昨天提到框架有以下優點:

  1. 增進開發效率:無需「重新發明輪子」,使開發人員專注在商業邏輯的實現上
  2. 解耦:框架就像一個工廠,尤其是在 Spring Framework 中將物件的建立和依賴關係都交由 Spring 容器管理,降低各元件間的耦合關係
  3. 降低 Java EE 的使用難度:框架將 Java 功能進行封裝
  4. 方便整合其他第三方套件或框架

接下來說說 Spring Framework 中的兩個重要的 core technologies

  1. Inversion Control 控制反轉:將 object 的控制權交給了外部的 Spring 容器來管理,再透過 @Autowired 註解依賴注入取得容器中的 object

    • 優點:

      • Loosing Coupling 鬆耦合
      • Lifecycle Management 生命週期管理
      • More testable 方便測試程式
    • 傳統 Java → company 和 keyboard 相依性高

      public class LogiKeyboard implements Keyboard{
      	@Override
      	public void type(String message){
      		System.out.println("羅技鍵盤:" + message);
      	}
      }
      
      public class company{
      
      	private Keyboard keyboard = new LogiKeyboard();
      
      	private void working(){
      		keyboard.type("I'm now working.");
      	}
      }
      
    • Spring IoC → 透過 @Autowired 依賴注入,取得存在 Spring 容器中的物件,company 依賴於 logiKeyboard

      @Component
      public class LogiKeyboard implements Keyboard{
      	@Override
      	public void type(String message){
      		System.out.println("羅技鍵盤:" + message);
      	}
      }
      
      @Component
      public class company{
      
      	@Autowired
      	private Keyboard keyboard;
      
      	private void working(){
      		keyboard.type("I'm now working.");
      	}
      }
      
    • 用比較生活化的例子解釋:

      1. 沒有 IoC
        你走進一間餐廳逕自跑到廚房,找出食材開始烹煮成菜單上的料理,最後放在餐桌上吃。這邊所有的過程(從選擇食材到烹飪再到擺盤)都是由自己所控制。
      2. 有 IoC
        進到餐廳後,你坐下來點了一份套餐,只要等待一陣子,餐點就會送到桌上。在這你把「製作餐點」的控制權轉交給餐廳的廚師及服務生。無需擔心該如何料理這道菜,只要告訴他們你想吃什麼然後餐點就會出現。

      在開發過程中沒有 IoC 代表所有東西都必須手刻,自行創建、自行配置和自行管理所有的物件 & 依賴關係。而有了 IoC ,這些麻煩事則交由框架自動完成。

  2. AOP (Aspect-Oriented Programming):

  • Spring 的這個功能允許我們自定義 Aspects (切面),而這些切面是橫切於多個方法或物件的 關注點,在 log & Transaction & Security 等也都有使用 AOP 的概念

  • 想像一下你在煮東西 (對,又在吃 XD)。


料理時的每個步驟 (例如切菜、炒菜、蒸飯) 都可以視作是一個方法的執行。這些都算是 `烹調` 這件事主要的業務邏輯。


身為一個病態潔癖仔(???),我在 🅐 烹飪前都會先洗手,🅑 烹飪後清理廚房。


這些動作 (洗手和清理) 是 `橫切` 在所有的烹調動作中,也是所謂 Aspects 的關注點 `Cross-Cutting Concern`。


在這個情境中,Spring AOP 就像是我的烹飪小幫手。


只要告訴這個小幫手:「在我烹飪前,提醒我洗手;完成後,請清理廚房。」這裡, `提醒洗手` 和 `清理廚房` 就是 AOP 中的 `Advice`,而 `開始烹飪` 和 `完成烹飪` 則為 `Join Points`。最後,我所設定的 `在開始前` 和 `完成後` 就是 `Pointcuts`。

AOP 的好處在這情境中可以讓我專注於核心任務 (煮食物 XD),而不是每次都去擔心這些 Aspects 任務,因為我知道有小幫手(AOP)會幫我處理。而在框架中,AOP 利用 橫切 技術將封裝物件拆解,將重複部分(幾乎都和業務邏輯無關)重新封裝提取出來,如此一來可以大大降低系統間的耦合度,並且增加程式碼的可維護性。

以下是幾個 AOP 觀念中的名詞術語:

  1. Aspect:切面,橫切的關注點。它定義了切面的功能和它的觸發時機。
  2. Join Point:程式執行時某個特定點,例如某方法的執行。在 Spring AOP 中,Join Point 通常是一個函數。
  3. Advice:Aspect 在特定 Join Point 上執行的動作。主要類型包括:前置 (before)、後置 (after)、返回後 (after returning)、拋出異常後 (after throwing) 和周圍 (around)。
  4. Pointcut:一組 Join Point,設定要被 AOP 切入的位置,例如某個類別或函數。
  5. Target Object:被一至多個切面所 target 的物件。

以上是兩個 Spring 框架中很重要的核心概念,希望這些舉例能幫助理解這些偏抽象的技術

有關 IoC 和 AOP 的文件及相關程式碼還是建議參考官方 document,這篇更像是我換句話說自行詮釋理解後的版本~


上一篇
Day 01 - The Flight of Spring Boot is Taking Off - Spring Boot 起飛之旅
下一篇
Day 03 - Spring MVC WalkThrough - 遊走 Spring MVC
系列文
Spring Boot 三十天挑戰賽30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言